package com;

/**
 * @author SnowmanAndBee
 * @version <version>
 * <description>
 * @date 2022/4/5 - 10:59
 */
public class Singleton {
    /**
     * volatile关键词确保，当uniqueInstance被初始化程成Singleton实例时，多个线程正确的处理uniqueInstance变量
     */
    private volatile static Singleton uniqueInstance;

    /**
     * 单例模式标志，使用静态方法和静态变量保存唯一的实例，构造器为私有的，只有静态方法可以进行调用，从而获得实例
     */
    private Singleton(){}

    /**
     * 通过此方法获得唯一实例，如果没有创建会进行创建
     * @return 返回单例的实例
     */
    public static Singleton getInstance() {
        //只有第一次执行该方法会执行其中全部代码
        if (uniqueInstance == null) {
            //多线程调用这个方法时，这样写可以增加效率，synchronized关键字内部只允许一个线程执行，这种写法成为双重检查加锁
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}
